﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestionePolveri2.DAL;
using GestionePolveriLib.BL;
using FrameworkLib.Facades;

namespace GestionePolveriLib.Facades
{
    [Serializable]
    public class FornitoriFacade : FacadeBase<GestionePolveriEntities>
    {
        public FornitoriFacade()
        {

        }

        public void LoadAsync(BackgroundWorkerCallbackBase.Callback callback)
        {
            this.RunAsync(() => GetFornitori(), callback);
        }

        public List<Fornitore> GetFornitori()
        {
            List<Fornitore> retValue = null;

            try
            {
                var obj = from x in this.GetContext().AnagFornitori
                          select new Fornitore
                          {
                              ID = x.IDFornitore,
                              Descrizione = x.Descrizione,
                              Note = x.Note
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public bool AddFornitore(Fornitore fornitore)
        {
            bool retValue = false;

            try
            {
                AnagFornitori imp = new AnagFornitori();
                imp.Descrizione = fornitore.Descrizione;
                imp.Note = fornitore.Note;

                this.GetContext().AnagFornitori.AddObject(imp);
                this.GetContext().SaveChanges();

                retValue = true;
            }
            catch (Exception ex)
            {
                // throw ex;
            }
            
            return retValue;
        }

        public bool DeleteFornitore(Fornitore fornitore)
        {
            bool retValue = false;

            try
            {
                var obj = from x in this.GetContext().AnagFornitori
                          where x.IDFornitore == fornitore.ID
                          select x;

                if (obj.Any())
                {
                    this.GetContext().AnagFornitori.DeleteObject(obj.FirstOrDefault());
                    this.GetContext().SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public bool ModifyFornitore(Fornitore fornitore)
        {
            bool retValue = false;

            try
            {
                var obj = from x in this.GetContext().AnagFornitori
                          where x.IDFornitore == fornitore.ID
                          select x;

                if (obj.Any())
                {
                    AnagFornitori imp = obj.FirstOrDefault();
                    imp.Descrizione = fornitore.Descrizione;
                    imp.Note = fornitore.Note;

                    this.GetContext().SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public Fornitore GetFornitore(string nome)
        {
            Fornitore retValue = null;

            try
            {
                var obj = from x in this.GetContext().AnagFornitori
                          where x.Descrizione == nome
                          select new Fornitore
                          {
                              ID = x.IDFornitore,
                              Descrizione = x.Descrizione,
                              Note = x.Note
                          };

                if (obj.Any())
                {
                    retValue = obj.FirstOrDefault();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }
    }
}
